package com.zjw.algorithm.utils;

import java.io.ByteArrayOutputStream;
import java.nio.charset.StandardCharsets;

public class ByteArrayBuffer {

    private final ByteArrayOutputStream buffer = new ByteArrayOutputStream();

    public void appendInt(int value) {
        appendBytes(transToBytes(value));
    }

    public void appendByte(byte value) {
        appendBytes(transToBytes(value));
    }

    public void appendShort(short value) {
        appendBytes(transToBytes(value));
    }

    public void appendLong(long value) {
        appendBytes(transToBytes(value));
    }

    public void appendBytes(byte[] bytes) {
        appendBytes(bytes, 0, bytes.length);
    }

    public void appendBytes(byte[] bytes, int offset, int len) {
        buffer.write(bytes, offset, len);
    }

    public byte[] toByteArray() {
        return buffer.toByteArray();
    }

    private byte[] transToBytes(Object value) {
        Class<?> type = value.getClass();
        if (type.equals(Integer.class)) {
            int i = (int) value;
            byte o1 = (byte) (i >> 24);
            byte o2 = (byte) (i >> 16);
            byte o3 = (byte) (i >> 8);
            byte o4 = (byte) (i);
            return new byte[]{o1, o2, o3, o4};
        } else if (type.equals(Long.class)) {
            long l = (long) value;
            byte o1 = (byte) (l >> 56);
            byte o2 = (byte) (l >> 48);
            byte o3 = (byte) (l >> 40);
            byte o4 = (byte) (l >> 32);
            byte o5 = (byte) (l >> 24);
            byte o6 = (byte) (l >> 16);
            byte o7 = (byte) (l >> 8);
            byte o8 = (byte) (l);
            return new byte[]{o1, o2, o3, o4, o5, o6, o7, o8};
        } else if (type.equals(Short.class)) {
            int ss = (int) value;
            byte o1 = (byte) (ss >> 8);
            byte o2 = (byte) (ss);
            return new byte[]{o1, o2};
        } else if (type.equals(Byte.class)) {
            return new byte[(byte) value];
        }
        return new byte[0];
    }
}
